package com.xcc.httpUtils.builder;

import com.xcc.httpUtils.request.RequestCall;

import java.util.LinkedHashMap;
import java.util.Map;


/**
 * Created by Carman on 2017/7/7.
 * BaseHttpRequestBuilder 抽象类.<br></>
 * request 配置信息存储类. <br></>
 * 如: 头信息, 参数, 访问连接, 标记
 *
 * PUT /collection/resource：返回完整的资源对象
 PATCH /collection/resource：返回完整的资源对象
 DELETE
 */
abstract class BaseHttpRequestBuilder<T extends BaseHttpRequestBuilder> {

    /**
     * url 地址
     */
    protected String url;
    /**
     * 请求头参数
     */
    protected Map<String, String> headers;
    /**
     * 请求参数
     */
    protected Map<String, String> params;

    /**
     * 标记
     */
    protected Object tag;

    protected String json;

    public BaseHttpRequestBuilder(String url) {
        this.url = url;
    }

    /**
     * 生成 RequestCall 对象
     *
     * @return RequestCall 对象
     */
    abstract public RequestCall build();

    /**
     * url 设置连接 url
     *
     * @param url
     * @return 当前使用对象
     */
    public T url(String url) {
        this.url = url;
        return (T) this;
    }

    /**
     * tag 设置 TAG
     *
     * @param tag 标记
     * @return 当前使用对象
     */
    public T tag(Object tag) {
        this.tag = tag;
        return (T) this;
    }

    /**
     * 添加头参数
     *
     * @param headers Map
     * @return 当前使用对象
     */
    public T headers(Map<String, String> headers) {
        this.headers = headers;
        return (T) this;
    }

    /**
     * 添加头参数
     *
     * @param key key
     * @param val value
     * @return 当前使用对象
     */
    public T addHeader(String key, String val) {
        if (this.headers == null) {
            headers = new LinkedHashMap<>();
        }
        headers.put(key, val);
        return (T) this;
    }

    /**
     * 添加 json 请求
     *
     * @param json
     * @return
     */
    public T addJson(String json){
        this.json = json;
        return (T) this;
    }
}
